package com.exit490.cfp.dao;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.exit490.cfp.helper.DataSourceHelper;
import com.exit490.cfp.modelo.Favorito;
import com.exit490.cfp.modelo.Transacao;

public class FavoritoDAO {

    public static String TABELA_NOME = "cpf_favoritos";
    public static String COLUNA_ID = "id_favoritos";
    public static String COLUNA_ID_CAPITAL = "id_capital";
    public static String COLUNA_ID_CATEGORIA = "id_categoria";
    public static String COLUNA_VALOR_TRANSACAO = "valor_transacao";
    public static String COLUNA_DATA_CONCRETIZACAO = "data_concretizacao";
    public static String COLUNA_DATA_TRANSACAO = "data_transacao";
    public static String COLUNA_RECEITA_DESPESA = "receita_despesa";

    private DataSourceHelper dataSource;
    private SQLiteDatabase sqlLite;
    private Cursor cursor = null;
    private ContentValues content = new ContentValues();
    private long linhasAfetadas;
    private String[] colunas = new String[] { COLUNA_ID, COLUNA_ID_CAPITAL, COLUNA_ID_CATEGORIA, COLUNA_RECEITA_DESPESA,
            COLUNA_VALOR_TRANSACAO, COLUNA_DATA_CONCRETIZACAO, COLUNA_DATA_TRANSACAO };

    public FavoritoDAO(Context context) {
        dataSource = new DataSourceHelper(context);
        this.sqlLite = dataSource.getDatabase();
    }

    public boolean inserirFavorito(Favorito favorito) {

        content.put(COLUNA_ID_CAPITAL, favorito.getIdCapital());
        content.put(COLUNA_ID_CATEGORIA, favorito.getIdCategoria());
        content.put(COLUNA_VALOR_TRANSACAO, favorito.getValorTransacao());
        content.put(COLUNA_RECEITA_DESPESA, favorito.getReceitaDespesa());
        content.put(COLUNA_DATA_TRANSACAO, favorito.getDataTransacao().toString());

        this.linhasAfetadas = this.sqlLite.insert(TABELA_NOME, null, content);

        return sucesso();
    }

    public long removerFavorito(Favorito favorito) {
        String[] args = { String.valueOf(favorito.getIdFavorito()) };
        return this.sqlLite.delete(TABELA_NOME, COLUNA_ID + "=?", args);
    }

    public boolean atualizaCapital(Favorito favorito) {

        String[] args = { String.valueOf(favorito.getIdFavorito()) };
        this.content.put(COLUNA_ID_CAPITAL, favorito.getIdCapital());
        this.linhasAfetadas = this.sqlLite.update(TABELA_NOME, this.content, COLUNA_ID + "=?", args);

        return sucesso();
    }

    public boolean atualizarDataConcretizacao(Favorito favorito) {

        String[] args = { String.valueOf(favorito.getIdFavorito()) };
        this.content.put(COLUNA_DATA_CONCRETIZACAO, favorito.getDataConcretizacao().toString());
        this.linhasAfetadas = this.sqlLite.update(TABELA_NOME, this.content, COLUNA_ID + "=?", args);

        return sucesso();
    }

    public boolean atualizarCategoria(Favorito favorito) {

        String[] args = { String.valueOf(favorito.getIdFavorito()) };
        this.content.put(COLUNA_ID_CATEGORIA, favorito.getIdCategoria());
        this.linhasAfetadas = this.sqlLite.update(TABELA_NOME, this.content, COLUNA_ID + "=?", args);

        return sucesso();
    }

    public boolean atualizarValor(Favorito favorito) {

        String[] args = { String.valueOf(favorito.getIdFavorito()) };
        this.content.put(COLUNA_VALOR_TRANSACAO, favorito.getValorTransacao());
        this.linhasAfetadas = this.sqlLite.update(TABELA_NOME, this.content, COLUNA_ID + "=?", args);

        return sucesso();
    }

    public boolean atualizarReceitaDespesa(Favorito favorito) {

        String[] args = { String.valueOf(favorito.getIdFavorito()) };
        this.content.put(COLUNA_RECEITA_DESPESA, favorito.getReceitaDespesa());
        this.linhasAfetadas = this.sqlLite.update(TABELA_NOME, this.content, COLUNA_ID + "=?", args);

        return sucesso();
    }

    public ArrayList<Transacao> slecionarTransacoesPorCapital() {

        ArrayList<Transacao> listaDeTransacoes = new ArrayList<Transacao>();
        Transacao transacao = new Transacao();
        Favorito favorito = new Favorito();

        String where = COLUNA_ID_CAPITAL + "= ?";
        String parseIdCapital = String.valueOf(favorito.getIdCapital());
        String argumentos[] = new String[] { parseIdCapital };
        cursor = sqlLite.query(TABELA_NOME, colunas, where, argumentos, null, null, null);

        if (cursor != null) {
            cursor.moveToFirst();
            while (cursor.moveToNext()) {
                favorito.setIdFavorito(cursor.getLong(cursor.getColumnIndex(COLUNA_ID)));
                favorito.setIdCapital(cursor.getLong(cursor.getColumnIndex(COLUNA_ID_CAPITAL)));
                favorito.setIdCategoria(cursor.getLong(cursor.getColumnIndex(COLUNA_ID_CATEGORIA)));
                favorito.setReceitaDespesa(cursor.getInt(cursor.getColumnIndex(COLUNA_RECEITA_DESPESA)));
                favorito.setValorTransacao(cursor.getDouble(cursor.getColumnIndex(COLUNA_VALOR_TRANSACAO)));
                favorito.setDataTransacao(cursor.getString(cursor.getColumnIndex(COLUNA_DATA_TRANSACAO)));
                favorito.setDataConcretizacao(cursor.getString(cursor.getColumnIndex(COLUNA_DATA_CONCRETIZACAO)));

                transacao.setIdTransacao(favorito.getIdFavorito());
                transacao.setIdCategoria(favorito.getIdCategoria());
                transacao.setIdCapital(favorito.getIdCapital());
                transacao.setDataTransacao(favorito.getDataTransacao());
                transacao.setDataConcretizacao(favorito.getDataConcretizacao());
                transacao.setReceitaDespesa(favorito.getReceitaDespesa());
                transacao.setValorTransacao(favorito.getValorTransacao());

                listaDeTransacoes.add(transacao);

            }
        }

        cursor.close();
        return listaDeTransacoes;
    }

    private boolean sucesso() {

        if (this.linhasAfetadas > 0) {
            return true;
        } else {
            return false;
        }
    }
}
